3.2.2 命名导入
如果要导入的多个包具有相同的名字,会发生什么?例如,既需要 network/convert
包来转换从网络读取的数据,又需要 file/convert
包来转换从文本文件读取的数据时,就会同时导入两个名叫 convert
的包。这种情况下,重名的包可以通过 命名导入 来导入。命名导入是指,在 import
语句给出的包路径的左侧定义一个名字,将导入的包命名为新名字。
例如,若用户已经使用了标准库里的 fmt
包,现在要导入自己项目里名叫 fmt
的包,就可以通过代码清单3-4所示的命名导入方式,在导入时重新命名自己的包。
代码清单3-4 重命名导入
01 package main
02
03 import (
04 "fmt"
05 myfmt "mylib/fmt"
06 )
07
08 func main() {
09 fmt.Println("Standard Library")
10 myfmt.Println("mylib/fmt")
11 }
当你导入了一个不在代码里使用的包时,Go编译器会编译失败,并输出一个错误。Go开发团队认为,这个特性可以防止导入了未被使用的包,避免代码变得臃肿。虽然这个特性会让人觉得很烦,但Go开发团队仍然花了很大的力气说服自己,决定加入这个特性,用来避免其他编程语言里常常遇到的一些问题,如得到一个塞满未使用库的超大可执行文件。很多语言在这种情况会使用警告做提示,而Go开发团队认为,与其让编译器告警,不如直接失败更有意义。每个编译过大型C程序的人都知道,在浩如烟海的编译器警告里找到一条有用的信息是多么困难的一件事。这种情况下编译失败会更加明确。
有时,用户可能需要导入一个包,但是不需要引用这个包的标识符。在这种情况下,可以使用空白标识符 _
来重命名这个导入。我们下节会讲到这个特性的用法。
空白标识符 下划线字符(
_
)在Go语言里称为空白标识符,有很多用法。这个标识符用来抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不感兴趣的值。